#include "stdafx.h"
#include "oknoglowne.h"




OknoGlowne::OknoGlowne() : Form1() {
   inicjalizacja();
   list1 = gcnew PointPairList();
   list2 = gcnew PointPairList();
   list3 = gcnew PointPairList();
   klient = gcnew Klient(this);
}


System::Void OknoGlowne::zmianaObiektu(std::map<std::string,std::string> konfig) {
   dodajMapeDoDataGrid(konfig,dataGridNastawyObiektu);
   std::map<std::string, std::string>::iterator it = konfig.find("[nazwa]=");
   if(it != konfig.end()) {
      textBoxObiekt->Text = Ramka::ToSysString(it->second);
   } else {
      textBoxObiekt->Clear();
   }	
}

System::Void OknoGlowne::zmianaRegulatora(std::map<std::string,std::string> konfig) {
   dodajMapeDoDataGrid(konfig,dataGridNastawyRegulatora);
   std::map<std::string, std::string>::iterator it = konfig.find("[nazwa]=");
   if(it != konfig.end()) {
      textBoxRegulator->Text = Ramka::ToSysString(it->second);
   } else {
      textBoxRegulator->Clear();
   }	
}

System::Void OknoGlowne::zmianaWartZad(std::map<std::string,std::string> konfig) {
   dodajMapeDoDataGrid(konfig, dataGridNastawyWartZad);
}

System::Void OknoGlowne::nowaMapaObiektow(cliext::map<System::String^,int> mapa) {
	dodajMapeDoComboBox(mapa,comboBoxObiekt);

}

System::Void OknoGlowne::nowaMapaRegulatorow(cliext::map<System::String^,int> mapa) {
	dodajMapeDoComboBox(mapa,comboBoxRegulator);

}

System::Void OknoGlowne::nowaMapaWartZad(cliext::map<System::String^,int> mapa) {
	 dodajMapeDoComboBox(mapa,comboBoxWartZad);

}

System::Void OknoGlowne::czyscRegulator() {
   textBoxRegulator->Clear();
   
}

System::Void OknoGlowne::dodajMapeRegulatorow() {
    dodajMapeDoComboBox(klient->pobierzMapeRegulatorow(),comboBoxRegulator);

}

System::Void OknoGlowne::dodajMapeGeneratorow() {
      dodajMapeDoComboBox(klient->pobierzMapeGeneratorow(),comboBoxWartZad);

}

System::Void OknoGlowne::dodajMapeObiektow() {
      dodajMapeDoComboBox(klient->pobierzMapeObiektow(),comboBoxObiekt);

}


System::Void OknoGlowne::nowaListaUstawionychGeneratorow
   (cliext::vector<System::String^> wektor) {
   int wyswietlonyGen = listBoxWartZad->SelectedIndex;
   dodajWektorDoListBox(wektor,listBoxWartZad);
   listBoxWartZad->SelectedIndex = wyswietlonyGen;
}

System::Void OknoGlowne::buttonSamonastrajanie_Click(System::Object^  sender, System::EventArgs^  e) {
   /*RegulatorPIDAdapt* regulatorPIDAdaptPtr = dynamic_cast<RegulatorPIDAdapt*>(regulator);
     if (regulatorPIDAdaptPtr && regulatorPIDAdaptPtr->czyPidAdaptacyjny()) {
     regulatorPIDAdaptPtr->ustawSamonastrajanie(true);
     buttonSamonastrajanie->Enabled = false;
     }*/
}

System::Void OknoGlowne::trackBarProbkowanie_Scroll(System::Object^  sender, System::EventArgs^  e) {
   numericUpDownProbkowanie->Value = trackBarProbkowanie->Value;
}

System::Void OknoGlowne::numericUpDownProbkowanie_ValueChanged(System::Object^  sender, System::EventArgs^  e) {
   trackBarProbkowanie->Value = (int)numericUpDownProbkowanie->Value;
   //symulator->ustawCzasProbkowania((int)numericUpDownProbkowanie->Value, fingerprint, 0);
}

System::Void OknoGlowne::buttonReset_Click(System::Object^  sender, System::EventArgs^  e) {
   //Reset(); //jedno wywolanie mniej?
   /*buttonStart->Enabled = true;
     buttonStop->Enabled = false;
     buttonWczytaj->Enabled = true;*/
	klient->symulatorReset();
     /*list1->Clear();
     list2->Clear();
     list3->Clear();
     myPane1->XAxis->Scale->Min = 0;
     myPane2->XAxis->Scale->Min = 0;
     dodajPktWykresu(0, 0, 0, 0);
     zedGWykres1->AxisChange();
     zedGWykres1->Refresh();
     zedGWykres2->AxisChange();
     zedGWykres2->Refresh();*/

     //symulator->symulatorReset(fingerprint, 0);
}

System::Void OknoGlowne::buttonStop_Click(System::Object^  sender, System::EventArgs^  e) {
   //symulacja = false;
   //symulator->symulatorStop(fingerprint, 0);
	klient->symulatorStop();
}

System::Void OknoGlowne::buttonOkObiekt_Click(System::Object^  sender, System::EventArgs^  e) {
   //symulator->ustawObiekt(comboBoxObiekt->Text, fingerprint, 0);
}



System::Void OknoGlowne::buttonOkRegulator_Click(System::Object^  sender, System::EventArgs^  e) {
   klient->ustawRegulator(comboBoxRegulator->Text);
}

System::Void OknoGlowne::buttonOkWartZad_Click(System::Object^  sender, System::EventArgs^  e) {
   klient->dodajWartZad(comboBoxWartZad->Text);
}


System::Void OknoGlowne::dodajMapeDoDataGrid(const std::map<std::string,std::string> &konfig, System::Windows::Forms::DataGridView^  docelowyDataGrid) {
   docelowyDataGrid->Rows->Clear();
   std::map<std::string,std::string>::const_iterator poczatek = konfig.begin();
   for( ; poczatek != konfig.end(); ++poczatek) {
      if ((poczatek->first.compare("[typ]=") != 0) && (poczatek->first.compare("[nazwa]=") != 0)) {
	 array<String^>  ^row = gcnew array<String^> {gcnew String(poczatek->first.c_str()),gcnew String(poczatek->second.c_str())};
	 docelowyDataGrid->Rows->Add(row);
      }
   }
}

System::Void OknoGlowne::dodajMapeCLIDoDataGrid(cliext::map<System::String^,System::String^> konfig, System::Windows::Forms::DataGridView^  docelowyDataGrid) {
   docelowyDataGrid->Rows->Clear();
   cliext::map<System::String^,System::String^>::const_iterator poczatek = konfig.begin();
   for( ; poczatek != konfig.end(); ++poczatek) {
      if (!(poczatek->first->Equals("[typ]=")) && !(poczatek->first->Equals("[nazwa]="))) {
	 array<String^>  ^row = gcnew array<String^> {poczatek->first,poczatek->second};
	 docelowyDataGrid->Rows->Add(row);
      }
   }
}


System::Void OknoGlowne::dodajRegulator() {
	cliext::map<System::String^,System::String^> konfig = klient->pobierzRegulator();
	dodajMapeCLIDoDataGrid(konfig,dataGridNastawyRegulatora);
	textBoxRegulator->Text = konfig["[nazwa]="];
/*   std::map<std::string, std::string>::iterator it = konfig.find("[nazwa]=");
   if(it != konfig.end()) {
      textBoxRegulator->Text = Ramka::ToSysString(it->second);
   } else {
      textBoxRegulator->Clear();
   }	*/
	
}

System::Void OknoGlowne::dodajObiekt() {
	cliext::map<System::String^,System::String^> konfig = klient->pobierzObiekt();
	dodajMapeCLIDoDataGrid(konfig,dataGridNastawyObiektu);
	textBoxObiekt->Text = konfig["[nazwa]="];
   /*std::map<std::string, std::string>::iterator it = konfig.find("[nazwa]=");
   if(it != konfig.end()) {
      textBoxRegulator->Text = Ramka::ToSysString(it->second);
   } else {
      textBoxRegulator->Clear();
   }*/	
	//zmianaObiektu(klient->pobierzObiekt());

}

System::Void OknoGlowne::dodajListeGeneratorow() {
	nowaListaUstawionychGeneratorow(klient->pobierzGeneratory());
}

System::Void OknoGlowne::dodajMapeDoComboBox(cliext::map<System::String^,int> mapa, System::Windows::Forms::ComboBox^ docelowyComboBox) {
   cliext::map<System::String^, int>::iterator it = mapa.begin();
   for(; it != mapa.end(); ++it) {
      docelowyComboBox->Items->Add(it->first);
   }
   docelowyComboBox->SelectedIndex = 0;
}

System::Void OknoGlowne::dodajWektorDoListBox(cliext::vector<System::String^> wektor,System::Windows::Forms::ListBox^ docelowyListBox) {
   docelowyListBox->Items->Clear();
   cliext::vector<System::String^>::iterator it = wektor.begin();
   for(; it != wektor.end(); ++it) {
      docelowyListBox->Items->Add(*it);
   }
}


System::Void OknoGlowne::usunDyskretne() {
   /*for (int i=0; i<wektorObiektow.size(); i++)	 delete wektorObiektow.at(i);
     wektorObiektow.clear();
     for (int i=0; i<wektorRegulatorow.size(); i++)	 delete wektorRegulatorow.at(i);
     wektorRegulatorow.clear();*/
}


System::Void OknoGlowne::wczytajKonfiguracje() {
   //tutaj bylo wczytanie konfigu, ale sie zmylo :)
}

System::Void OknoGlowne::buttonWczytaj_Click(System::Object^  sender, System::EventArgs^  e) {

   //std::string nazwaObiektu = ToStdString(comboBoxObiekty->Text);
/*   buttonWczytaj->Enabled = false;
   buttonZapisz->Enabled = true;
   wczytajKonfiguracje();*/
}


System::Void OknoGlowne::buttonZapisz_Click(System::Object^  sender, System::EventArgs^  e) {
   /*		try {
		PlikKonfiguracyjny::pobierzInstancje().zapisz(wektorDyskretnych);
		} catch (Wyjatek &e) {
		System::Windows::Forms::MessageBox::Show("Blad pliku konfiguracyjnego. Nie udalo sie zapisac konfiguracji",
		"Blad",System::Windows::Forms::MessageBoxButtons::OK,
		System::Windows::Forms::MessageBoxIcon::Error);
		}*/

}


System::Void OknoGlowne::Reset() {
   list1->Clear();
   list2->Clear();
   list3->Clear();
   myPane1->XAxis->Scale->Min = 0;
   myPane2->XAxis->Scale->Min = 0;
   dodajPktWykresu(0, 0, 0, 0);  
    zedGWykres1->AxisChange();
     zedGWykres1->Refresh();
     zedGWykres2->AxisChange();
     zedGWykres2->Refresh();

   //		nrProbki=1;
}


/*std::string OknoGlowne::ToStdString(System::String^ source) {
   std::string result;
   int len = source->Length;
   for (int i=0; i<len; i++)
      result += (char)source[i];
   return result;
}

System::String^ OknoGlowne::ToSysString(std::string source) {
   System::String^ result;
   int len = (int)source.length();
   for (int i=0; i<len; i++)
      result += (wchar_t)source[i];
   return result;
   }*/

System::Void OknoGlowne::inicjalizacja() {
  // this->buttonWczytaj->Click += gcnew System::EventHandler(this, &OknoGlowne::buttonWczytaj_Click);
   this->buttonOkObiekt->Click += gcnew System::EventHandler(this, &OknoGlowne::buttonOkObiekt_Click);
   this->buttonOkRegulator->Click += gcnew System::EventHandler(this, &OknoGlowne::buttonOkRegulator_Click);
   //this->buttonZapisz->Click += gcnew System::EventHandler(this, &OknoGlowne::buttonZapisz_Click);
//   this->buttonSamonastrajanie->Click += gcnew System::EventHandler(this, &OknoGlowne::buttonSamonastrajanie_Click);
   this->buttonReset->Click += gcnew System::EventHandler(this, &OknoGlowne::buttonReset_Click);
   this->buttonStop->Click += gcnew System::EventHandler(this, &OknoGlowne::buttonStop_Click);
   this->numericUpDownProbkowanie->ValueChanged += gcnew System::EventHandler(this, &OknoGlowne::numericUpDownProbkowanie_ValueChanged);
   this->trackBarProbkowanie->Scroll += gcnew System::EventHandler(this, &OknoGlowne::trackBarProbkowanie_Scroll);
   this->buttonStart->Click += gcnew System::EventHandler(this, &OknoGlowne::buttonStart_Click);
   this->buttonZamknij->Click += gcnew System::EventHandler(this, &OknoGlowne::buttonZamknij_Click);
   this->buttonOkWartZad->Click += gcnew System::EventHandler(this, &OknoGlowne::buttonOkWartZad_Click);
   this->listBoxWartZad->SelectedIndexChanged += gcnew System::EventHandler(this, &OknoGlowne::listBoxWartZad_SelectedIndexChanged);
   this->buttonZmienParamGeneratora->Click += gcnew System::EventHandler(this, &OknoGlowne::buttonZmienParamGeneratora_Click);
   this->buttonZmienParamRegulatora->Click += gcnew System::EventHandler(this, &OknoGlowne::buttonZmienParamRegulatora_Click);
   this->buttonZaloguj->Click += gcnew System::EventHandler(this, &OknoGlowne::buttonZaloguj_Click);

}

System::Void OknoGlowne::buttonZaloguj_Click(System::Object^  sender, System::EventArgs^  e) {
   //symulator->zmienParametryGeneratora(ToStdString(listBoxWartZad->SelectedItem->ToString()),dataGridDoMapy(listBoxWartZad->SelectedItem->ToString(),dataGridNastawyWartZad), fingerprint, 0);
   klient->polacz(ToStdString(this->textBoxIP->Text),
		  ToStdString(this->textBoxPort->Text));
   klient->zaloguj(ToStdString(this->textBoxLogin->Text),
		  ToStdString(this->textBoxHaslo->Text));
}


System::Void OknoGlowne::buttonZmienParamGeneratora_Click(System::Object^  sender, System::EventArgs^  e) {
   //symulator->zmienParametryGeneratora(ToStdString(listBoxWartZad->SelectedItem->ToString()),dataGridDoMapy(listBoxWartZad->SelectedItem->ToString(),dataGridNastawyWartZad), fingerprint, 0);
}

System::Void  OknoGlowne::buttonZmienParamRegulatora_Click(System::Object^  sender, System::EventArgs^  e) {
   //symulator->zmienParametryRegulatora(dataGridDoMapy(textBoxRegulator->Text,dataGridNastawyRegulatora), fingerprint, 0);
}

System::Void OknoGlowne::listBoxWartZad_SelectedIndexChanged( System::Object^  sender, System::EventArgs^  e) {
   //dodajMapeDoDataGrid(symulator->pobierzKonfigGeneratora(ToStdString(listBoxWartZad->SelectedItem->ToString())), dataGridNastawyWartZad);
}

System::Void OknoGlowne::buttonZamknij_Click(System::Object^  sender, System::EventArgs^  e) {
   this->Close();
}


System::Void OknoGlowne::buttonStart_Click(System::Object^  sender, System::EventArgs^  e) {
   //symulator->symulatorStart(fingerprint, 0);
	klient->symulatorStart();	
}

System::Void OknoGlowne::dodajPktWykresu(double x, double y1, double y2, double y3 ) {
   list1->Add(x, y1);
   list2->Add(x, y2);
   list3->Add(x, y3);
   
   zedGWykres1->AxisChange();	
   zedGWykres1->Refresh();
   zedGWykres2->AxisChange();
   zedGWykres2->Refresh();
}

/*System::Void OknoGlowne::dodajPktWykresu(cliext::vector<double> dane) {
   cliext::vector<double>::iterator it = dane.begin();
   dodajPktWykresu(*it,*(it+1),*(it+2),*(it+3));
}*/

System::Void OknoGlowne::Zamknij() {
   //symulator->symulatorStop(fingerprint, 0);
}

std::map<std::string,std::string> OknoGlowne::dataGridDoMapy(System::String^ nazwa, System::Windows::Forms::DataGridView^ dataGrid) {
   std::map<std::string,std::string> wynik;
   wynik["[nazwa]="] = ToStdString(nazwa);
   wynik["[typ]="] = "pustka"; //taki hack, bo ObiektDyskretny musi koniecznie
                               //miec 2 pola wiecej niz to konieczne nazwa i typ
                               //a info o typie tutaj nie ma - to nie bug, to ficzer
   for(int i = 0; i < dataGrid->RowCount; i++) {
      wynik[ToStdString(dataGrid[0,i]->Value->ToString())] = ToStdString(dataGrid[1,i]->Value->ToString());
   }
   return wynik;
}

